package club.westudy.distributed.lock.internal;

import club.westudy.distributed.lock.DistributedLockService;

/**
 * 内部锁执行服务
 * 该接口是对依赖的分布式锁的实现进行抽象
 */
public interface InternalLockExecutorService {
    /**
     * 初始化分布式锁服务
     *
     * @param guardScanTimeMs 守卫扫描时间，单位毫秒
     */
    void initial(long guardScanTimeMs);

    /**
     * 销毁分布式锁服务
     */
    void destroy();

    /**
     * 获取锁
     *
     * @param feature           锁特征
     * @param maxLeaseTimeMs    持有锁最长时间（单位毫秒）
     * @param tryLockWaitTimeMs 等待锁超时时间（单位毫秒）
     * @return 临界区上下文
     */
    DistributedLockService.CriticalRegionContext acquire(String feature, long maxLeaseTimeMs, long tryLockWaitTimeMs) throws Exception;

    /**
     * 释放某个特征的锁，此方法用于编程式方式使用分布式锁服务
     *
     * @param criticalRegionContext 临界区上下文
     */
    void release(DistributedLockService.CriticalRegionContext criticalRegionContext) throws Exception;
}
